package cn.tedu.charging.order.rabbit;


import cn.tedu.charging.order.config.RabbitConfiguration;
import cn.tedu.charging.order.constant.OrderStatusConstant;
import cn.tedu.charging.order.dao.mapper.OrderSuccessMapper;
import cn.tedu.charging.order.dao.repository.OrderRepository;
import cn.tedu.charging.order.pojo.po.ChargingBillSuccessPO;
import cn.tedu.charging.order.pojo.po.OrderMQPO;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 消费死信队列的消息
 */

@Slf4j
@Component
public class RabbitMQOrderConsumer {
    @Autowired
    private OrderRepository orderRepository;
    @RabbitListener(queues= RabbitConfiguration.DEAD_LETTER_QUEUE_NAME)
    public void consumeChargingQueue(OrderMQPO orderMQPO, Message message, Channel channel) throws IOException {
        log.debug("消息死信队列信息:{}",orderMQPO);
        orderRepository.updateOrderStatusFromProcess2ExceptionEnd(orderMQPO.getOrderNo());
        //更通用,但是和业务无关
        //orderSuccessMapper.updateOrderStatus(orderNo,fromStatus,toStatus);
        //消息队列中的ack
        //consumeChargingQueue 消费者 从Rabbitmq 消费消息 ,处理业务 更新订单状态
        //  正常情况  自动ack 默认
        //      更新订单状态,返回ack给消息队列
        //      消息队列收到消费者发送的ack后,任务消费者消费消息成功了,消息队列会把这条消息从队列中删除,消费者可以继续消费下一条消息
        //  异常情况
        //      更新订单状态,数据库出现异常,更新失败,消费者会抛异常,如果是自动ack,还是返回ack给消息队列,消息队列收到ack 删除消息
        //   改为手动ack,如果更新失败,不返回ack给消息队列
        //      消息队列没有收到ack,认为消费者没有成功消费消息,不会删除,会一直保存

        //   等数据库恢复,消费者会继续重新消费这条消息,继续更新订单的状态,消息没丢.
        //手动ack 可以手动把下面的两行代码注释掉,会发现,消息队列中的消息不会被删除,会一直保留
        long deliveryTag=message.getMessageProperties().getDeliveryTag();
        channel.basicAck(deliveryTag,true);
    }
}
